/*
* 采用fasthttp搭建服务
* 服务中心，存储多节点，对外提供服务
* 自定义rpc，或者使用resp
**/
package asynet

import (
	"asy-cache-center/hash"
	"fmt"
	"log"
	"time"
)

// ServerCenter 存储节点信息，服务中心存储节点
type ServerCenter struct {
	centerList []string           // 多中心表单
	timestamp  int64              // 版本时间戳 -> time.Now().Unix()
	RouteMap   *hash.ConsitentMap // 路由字典
}

// NewCenter 初始化一个服务中心
func NewCenter(list []string) *ServerCenter {
	return &ServerCenter{
		centerList: list,
		timestamp:  time.Now().Unix(),
		RouteMap:   hash.New(),
	}
}

// 添加新的节点
func (s *ServerCenter) Add(virtualNode int, addrs ...string) {
	strs := make([]string, len(addrs))
	for i, addr := range addrs {
		strs[i] = addr
	}
	s.RouteMap.Add(virtualNode, strs)
	newTamp := time.Now().Unix()
	if newTamp < s.timestamp { // 时钟出现问题
		s.timestamp++
		log.Panic("[Center_LOG] 时钟发现问题")
		return
	}
	s.timestamp = newTamp
}

// 获取节点
func (s *ServerCenter) Get(key string) string {
	fmt.Println(s.RouteMap)
	return s.RouteMap.Get(key)
}

// 删除节点
func (s *ServerCenter) Del(hash int) {
	s.RouteMap.Del(hash)
}

// 获取节点信息map
func (s *ServerCenter) All() (keys []int, nodeMap map[int]string) {
	return s.RouteMap.Keys, s.RouteMap.NodeMap
}
